'use strict';
/**
 * author：小小游 --- allen
 * date：2018.02.05
 * lastUpdateDate：2018.02.05
 * description：Generator函数与yield语句的使用
 */
 /**
  * 这是一个generator函数，内部它实现了Iterator接口
  * generator函数可以配合yield语句一起执行，如果没有yield语句，
  * 那么当调用next()方法的时候，就会执行完整个generator函数
  * 如果有了yield语句，它会把generator函数内部分成几段去执行，
  * 那么每一个断点是通过yield语句来暂停的
  */
function * fn () {
    yield 1;
    yield 2;
    yield 3;
    /**
     * 即使没有return的结果最后返回的也是 { value: undefined, done: true }
     * 表示循环已经结束
     */
    return 4;
}

// 如果像普通函数一样调用它是不会输出任何结果的
// fn ();

/**
 * 那么当我们执行一个generator函数的时候，它内部会给我们
 * 返回一个Iterator的指针对象，通过调用next()方法，它就
 * 会执行方法体，那么调用next()方法它会返回一个结果，这个
 * 结果有两个值，如下：
 * { value: undefined, done: true }
 * 也就是说一个是当前循环的value值，另一个是当前循环是否
 * 结束的done，如果{ value: undefined, done: true }
 * 那么表示循环已经结束，任务已finished!
 * 说得直白一些，每次next()函数调用返回的结果其实都是内部
 * generator函数执行之后return之后的值，如下例子所示：
 */
/**
 * 那么当我们第一次调用next()的时候，它返回的是yield右侧的值，
 * 并且 { value: 1, done: false }，done为false表示循环
 * 还没有结束，得继续调用next()方法往下执行，直到返回结果为
 * { value: undefined, done: true }的时候表示循环已经
 * 结束
 */
let iterator = fn ();
// // result：{ value: 1, done: false }
// console.log(iterator.next());
// // result：{ value: 1, done: false }
// console.log(iterator.next());
// // result：{ value: 1, done: false }
// console.log(iterator.next());
// // result：{ value: 4, done: true }
// console.log(iterator.next());

/**
 * 既然generator函数实现了Iterator接口，那么自然可以使用
 * for..of循环遍历所有的值，如下所示：
 */
/**
 * 注意：这里只会打印出done为false的值，一旦done为true了，
 * 这个值用for..of循环是打印不出来的
 */
for ( let v of iterator ) console.log(v);
